<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>MyTechBook</title>
        
    <link rel="stylesheet" type="text/css" href="../../static/css/main.css">
</head>
<body>
<div class="navbar navbar-line">
    <div class="container">
        <div class="logo">
            
                MyTechBook
            
        </div>
        <input type="checkbox" id="idoc_nav" />
        <div class="menu_tree">
        <ul><li><a href="../../index.html">首页</a></li><li><a href="#"><span></span>前沿观察</a><ul><li><a href="../../html/前沿观察/ECMAScript 6入门.html">ECMAScript 6入门</a></li><li><a href="../../html/前沿观察/Immutable详解及React中实践.html">Immutable详解及React中实践</a></li><li><a href="../../html/前沿观察/Node.js MVC框架ThinkJS.html">Node.js MVC框架ThinkJS</a></li><li><a href="../../html/前沿观察/Nodejs 5.0.0版本.html">Nodejs 5.0.0版本</a></li><li><a href="../../html/前沿观察/关系型数据库PostgreSQL.html">关系型数据库PostgreSQL</a></li><li><a href="../../html/前沿观察/轻型MVVM框架Vue.js.html">轻型MVVM框架Vue.js</a></li><li class="active"><a href="../../html/前沿观察/基于nodejs的开发框架koa.html">基于nodejs的开发框架koa</a></li></ul></li><li><a href="#"><span></span>前端工程化</a><ul><li><a href="../../html/前端工程化/前端模板.html">前端模板</a></li><li><a href="../../html/前端工程化/性能优化和前端工程的爱恨情仇.html">性能优化和前端工程的爱恨情仇</a></li><li><a href="../../html/前端工程化/webpack入门及实践.html">webpack入门及实践</a></li><li><a href="../../html/前端工程化/前端工程化不完全装逼指南.html">前端工程化不完全装逼指南</a></li></ul></li><li><a href="#"><span></span>性能优化</a><ul><li><a href="../../html/性能优化/jshint代码质量检测.html">jshint代码质量检测</a></li><li><a href="../../html/性能优化/jshint配置说明.html">jshint配置说明</a></li><li><a href="../../html/性能优化/NC性能优化.html">NC性能优化</a></li><li><a href="../../html/性能优化/React编码规范.html">React编码规范</a></li><li><a href="../../html/性能优化/性能优化待办事项.html">性能优化待办事项</a></li><li><a href="../../html/性能优化/性能优化点总结.html">性能优化点总结</a></li></ul></li><li><a href="#"><span></span>技术分享</a><ul><li><a href="../../html/技术分享/React技术分享.html">React技术分享</a></li><li><a href="../../html/技术分享/学习Git.html">学习Git</a></li><li><a href="../../html/技术分享/面向对象.html">面向对象</a></li><li><a href="../../html/技术分享/Node.js知识详解.html">Node.js知识详解</a></li><li><a href="../../html/技术分享/2015年大前端技术年终总结.html">2015年大前端技术年终总结</a></li></ul></li><li><a href="#"><span></span>随想笔记</a><ul><li><a href="../../html/随想笔记/项目技术栈规划.html">项目技术栈规划</a></li><li><a href="../../html/随想笔记/笔试面试大纲.html">笔试面试大纲</a></li></ul></li><li><a href="../../html/CONTACT.html">CONTACT</a></li></ul>    
        </div>
        
        
        <div class="forkgithub"><a target="_blank" href="https://github.com/sujunming">fork on github</a></div>
        

        <section class="idoc_nav_btn">
            <label for="idoc_nav"><span></span></label>
        </section>
    </div>
    
</div>




<div class="container">

    <div class="page-toc">
        <ul><li><a href="#t0基于Nodejs.js平台的下一代web开发框架koa">基于Nodejs.js平台的下一代web开发框架koa</a><ul><li><a href="#t1简介">简介</a></li><li><a href="#t2安装">安装</a></li><li><a href="#t3使用koa">使用koa</a><ul><li><a href="#t4用koa写一个hello world">用koa写一个hello world</a></li><li><a href="#t5中间件的级联">中间件的级联</a></li><li><a href="#t6koa的简单配置">koa的简单配置</a></li></ul></li><li><a href="#t7带你了解koa的API">带你了解koa的API</a><ul><li><a href="#t8app.listen(...)">app.listen(...)</a></li><li><a href="#t9app.callback()">app.callback()</a></li><li><a href="#t10更多API">更多API</a></li><li><a href="#t11错误处理">错误处理</a></li></ul></li><li><a href="#t12Context">Context</a><ul><li><a href="#t13ctx对象里面的API们">ctx对象里面的API们</a></li></ul></li><li><a href="#t14相关学习资料">相关学习资料</a></li></ul></li></ul>
    </div>
    
    <div class="content markdown-body">
        <h1 id="t0&#x57FA;&#x4E8E;Nodejs.js&#x5E73;&#x53F0;&#x7684;&#x4E0B;&#x4E00;&#x4EE3;web&#x5F00;&#x53D1;&#x6846;&#x67B6;koa">&#x57FA;&#x4E8E;Nodejs.js&#x5E73;&#x53F0;&#x7684;&#x4E0B;&#x4E00;&#x4EE3;web&#x5F00;&#x53D1;&#x6846;&#x67B6;koa <a href="#t0&#x57FA;&#x4E8E;Nodejs.js&#x5E73;&#x53F0;&#x7684;&#x4E0B;&#x4E00;&#x4EE3;web&#x5F00;&#x53D1;&#x6846;&#x67B6;koa"> # </a></h1>
<h2 id="t1&#x7B80;&#x4ECB;">&#x7B80;&#x4ECB; <a href="#t1&#x7B80;&#x4ECB;"> # </a></h2>
<p>koa &#x662F;&#x7531; Express &#x539F;&#x73ED;&#x4EBA;&#x9A6C;&#x6253;&#x9020;&#x7684;&#xFF0C;&#x81F4;&#x529B;&#x4E8E;&#x6210;&#x4E3A;&#x4E00;&#x4E2A;&#x66F4;&#x5C0F;&#x3001;&#x66F4;&#x5BCC;&#x6709;&#x8868;&#x73B0;&#x529B;&#x3001;&#x66F4;&#x5065;&#x58EE;&#x7684; Web &#x6846;&#x67B6;&#x3002;&#x4F7F;&#x7528; koa &#x7F16;&#x5199; web &#x5E94;&#x7528;&#xFF0C;&#x901A;&#x8FC7;&#x7EC4;&#x5408;&#x4E0D;&#x540C;&#x7684; generator&#xFF0C;&#x53EF;&#x4EE5;&#x514D;&#x9664;&#x91CD;&#x590D;&#x7E41;&#x7410;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5D4C;&#x5957;&#xFF0C;&#x5E76;&#x6781;&#x5927;&#x5730;&#x63D0;&#x5347;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x7684;&#x6548;&#x7387;&#x3002;koa &#x4E0D;&#x5728;&#x5185;&#x6838;&#x65B9;&#x6CD5;&#x4E2D;&#x7ED1;&#x5B9A;&#x4EFB;&#x4F55;&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x5B83;&#x4EC5;&#x4EC5;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x8F7B;&#x91CF;&#x4F18;&#x96C5;&#x7684;&#x51FD;&#x6570;&#x5E93;&#xFF0C;&#x4F7F;&#x5F97;&#x7F16;&#x5199; Web &#x5E94;&#x7528;&#x53D8;&#x5F97;&#x5F97;&#x5FC3;&#x5E94;&#x624B;&#x3002;</p>
<h2 id="t2&#x5B89;&#x88C5;">&#x5B89;&#x88C5; <a href="#t2&#x5B89;&#x88C5;"> # </a></h2>
<blockquote>
<p>Koa &#x76EE;&#x524D;&#x9700;&#x8981; &gt;=0.11.x&#x7248;&#x672C;&#x7684; node &#x73AF;&#x5883;&#x3002;</p>
</blockquote>
<p>&#x5728;&#x4F60;&#x7684;&#x9879;&#x76EE;&#x4E2D;&#x5B89;&#x88C5;koa</p>
<pre><code>npm install koa --save
</code></pre><p>&#x9700;&#x8981;&#x5728;&#x6267;&#x884C; node &#x7684;&#x65F6;&#x5019;&#x9644;&#x5E26; --harmony &#x6765;&#x5F15;&#x5165; generators &#x3002;&#x5982;&#xFF1A;</p>
<pre><code>node --harmony app.js
</code></pre><h2 id="t3&#x4F7F;&#x7528;koa">&#x4F7F;&#x7528;koa <a href="#t3&#x4F7F;&#x7528;koa"> # </a></h2>
<p>Koa &#x5E94;&#x7528;&#x662F;&#x4E00;&#x4E2A;&#x5305;&#x542B;&#x4E00;&#x7CFB;&#x5217;&#x4E2D;&#x95F4;&#x4EF6; generator &#x51FD;&#x6570;&#x7684;&#x5BF9;&#x8C61;&#x3002; &#x8FD9;&#x4E9B;&#x4E2D;&#x95F4;&#x4EF6;&#x51FD;&#x6570;&#x57FA;&#x4E8E; request &#x8BF7;&#x6C42;&#x4EE5;&#x4E00;&#x4E2A;&#x7C7B;&#x4F3C;&#x4E8E;&#x6808;&#x7684;&#x7ED3;&#x6784;&#x7EC4;&#x6210;&#x5E76;&#x4F9D;&#x6B21;&#x6267;&#x884C;&#x3002; Koa &#x7C7B;&#x4F3C;&#x4E8E;&#x5176;&#x4ED6;&#x4E2D;&#x95F4;&#x4EF6;&#x7CFB;&#x7EDF;&#xFF08;&#x6BD4;&#x5982; Ruby&apos;s Rack &#x3001;Connect &#x7B49;&#xFF09;&#xFF0C; &#x7136;&#x800C; Koa &#x7684;&#x6838;&#x5FC3;&#x8BBE;&#x8BA1;&#x601D;&#x8DEF;&#x662F;&#x4E3A;&#x4E2D;&#x95F4;&#x4EF6;&#x5C42;&#x63D0;&#x4F9B;&#x9AD8;&#x7EA7;&#x8BED;&#x6CD5;&#x7CD6;&#x5C01;&#x88C5;&#xFF0C;&#x4EE5;&#x589E;&#x5F3A;&#x5176;&#x4E92;&#x7528;&#x6027;&#x548C;&#x5065;&#x58EE;&#x6027;&#xFF0C;&#x5E76;&#x4F7F;&#x5F97;&#x7F16;&#x5199;&#x4E2D;&#x95F4;&#x4EF6;&#x53D8;&#x5F97;&#x76F8;&#x5F53;&#x6709;&#x8DA3;&#x3002;</p>
<p>Koa &#x5305;&#x542B;&#x4E86;&#x50CF; content-negotiation&#xFF08;&#x5185;&#x5BB9;&#x534F;&#x5546;&#xFF09;&#x3001;cache freshness&#xFF08;&#x7F13;&#x5B58;&#x5237;&#x65B0;&#xFF09;&#x3001;proxy support&#xFF08;&#x4EE3;&#x7406;&#x652F;&#x6301;&#xFF09;&#x548C; redirection&#xFF08;&#x91CD;&#x5B9A;&#x5411;&#xFF09;&#x7B49;&#x5E38;&#x7528;&#x4EFB;&#x52A1;&#x65B9;&#x6CD5;&#x3002; &#x4E0E;&#x63D0;&#x4F9B;&#x5E9E;&#x5927;&#x7684;&#x51FD;&#x6570;&#x652F;&#x6301;&#x4E0D;&#x540C;&#xFF0C;Koa&#x53EA;&#x5305;&#x542B;&#x5F88;&#x5C0F;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x56E0;&#x4E3A;Koa&#x5E76;&#x4E0D;&#x7ED1;&#x5B9A;&#x4EFB;&#x4F55;&#x4E2D;&#x95F4;&#x4EF6;&#x3002;</p>
<h3 id="t4&#x7528;koa&#x5199;&#x4E00;&#x4E2A;hello world">&#x7528;koa&#x5199;&#x4E00;&#x4E2A;hello world <a href="#t4&#x7528;koa&#x5199;&#x4E00;&#x4E2A;hello world"> # </a></h3>
<pre><code>var koa = require(&apos;koa&apos;);
var app = koa();

app.use(function *(){
  this.body = &apos;Hello World&apos;;
});

app.listen(3000);
</code></pre><h3 id="t5&#x4E2D;&#x95F4;&#x4EF6;&#x7684;&#x7EA7;&#x8054;">&#x4E2D;&#x95F4;&#x4EF6;&#x7684;&#x7EA7;&#x8054; <a href="#t5&#x4E2D;&#x95F4;&#x4EF6;&#x7684;&#x7EA7;&#x8054;"> # </a></h3>
<p>Koa &#x7684;&#x4E2D;&#x95F4;&#x4EF6;&#x901A;&#x8FC7;&#x4E00;&#x79CD;&#x66F4;&#x52A0;&#x4F20;&#x7EDF;&#xFF08;&#x60A8;&#x4E5F;&#x8BB8;&#x4F1A;&#x5F88;&#x719F;&#x6089;&#xFF09;&#x7684;&#x65B9;&#x5F0F;&#x8FDB;&#x884C;&#x7EA7;&#x8054;&#xFF0C;&#x6452;&#x5F03;&#x4E86;&#x4EE5;&#x5F80; node &#x9891;&#x7E41;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x9020;&#x6210;&#x7684;&#x590D;&#x6742;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x3002; &#x6211;&#x4EEC;&#x901A;&#x8FC7; generators &#x6765;&#x5B9E;&#x73B0;&#x201C;&#x771F;&#x6B63;&#x201D;&#x7684;&#x4E2D;&#x95F4;&#x4EF6;&#x3002; Connect &#x7B80;&#x5355;&#x5730;&#x5C06;&#x63A7;&#x5236;&#x6743;&#x4EA4;&#x7ED9;&#x4E00;&#x7CFB;&#x5217;&#x51FD;&#x6570;&#x6765;&#x5904;&#x7406;&#xFF0C;&#x76F4;&#x5230;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x3002; &#x4E0E;&#x4E4B;&#x4E0D;&#x540C;&#xFF0C;&#x5F53;&#x6267;&#x884C;&#x5230; yield next &#x8BED;&#x53E5;&#x65F6;&#xFF0C;Koa &#x6682;&#x505C;&#x4E86;&#x8BE5;&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x7EE7;&#x7EED;&#x6267;&#x884C;&#x4E0B;&#x4E00;&#x4E2A;&#x7B26;&#x5408;&#x8BF7;&#x6C42;&#x7684;&#x4E2D;&#x95F4;&#x4EF6;(&apos;downstrem&apos;)&#xFF0C;&#x7136;&#x540E;&#x63A7;&#x5236;&#x6743;&#x518D;&#x9010;&#x7EA7;&#x8FD4;&#x56DE;&#x7ED9;&#x4E0A;&#x5C42;&#x4E2D;&#x95F4;&#x4EF6;(&apos;upstream&apos;)&#x3002;</p>
<p><strong>&#x793A;&#x4F8B;&#xFF1A;</strong></p>
<pre><code>var koa = require(&apos;koa&apos;);
var app = koa();

// x-response-time

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  this.set(&apos;X-Response-Time&apos;, ms + &apos;ms&apos;);
});

// logger

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log(&apos;%s %s - %s&apos;, this.method, this.url, ms);
});

// response

app.use(function *(){
  this.body = &apos;Hello World&apos;;
});

app.listen(3000);
</code></pre><p><strong>&#x4EE3;&#x7801;&#x5206;&#x6790;&#xFF1A;</strong></p>
<p>&#x5F53;&#x8BF7;&#x6C42;&#x5F00;&#x59CB;&#x65F6;&#xFF0C;&#x8BF7;&#x6C42;&#x5148;&#x7ECF;&#x8FC7; x-response-time &#x548C; logging &#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x5E76;&#x8BB0;&#x5F55;&#x4E2D;&#x95F4;&#x4EF6;&#x6267;&#x884C;&#x8D77;&#x59CB;&#x65F6;&#x95F4;&#x3002; &#x7136;&#x540E;&#x5C06;&#x63A7;&#x5236;&#x6743;&#x4EA4;&#x7ED9; reponse &#x4E2D;&#x95F4;&#x4EF6;&#x3002;&#x5F53;&#x4E2D;&#x95F4;&#x4EF6;&#x8FD0;&#x884C;&#x5230; yield next &#x65F6;&#xFF0C;&#x51FD;&#x6570;&#x6302;&#x8D77;&#x5E76;&#x5C06;&#x63A7;&#x5236;&#x524D;&#x4EA4;&#x7ED9;&#x4E0B;&#x4E00;&#x4E2A;&#x4E2D;&#x95F4;&#x4EF6;&#x3002;&#x5F53;&#x6CA1;&#x6709;&#x4E2D;&#x95F4;&#x4EF6;&#x6267;&#x884C; yield next &#x65F6;&#xFF0C;&#x7A0B;&#x5E8F;&#x6808;&#x4F1A;&#x9006;&#x5E8F;&#x5524;&#x8D77;&#x88AB;&#x6302;&#x8D77;&#x7684;&#x4E2D;&#x95F4;&#x4EF6;&#x6765;&#x6267;&#x884C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<h3 id="t6koa&#x7684;&#x7B80;&#x5355;&#x914D;&#x7F6E;">koa&#x7684;&#x7B80;&#x5355;&#x914D;&#x7F6E; <a href="#t6koa&#x7684;&#x7B80;&#x5355;&#x914D;&#x7F6E;"> # </a></h3>
<p>&#x5E94;&#x7528;&#x914D;&#x7F6E;&#x662F; app &#x5B9E;&#x4F8B;&#x5C5E;&#x6027;&#xFF0C;&#x76EE;&#x524D;&#x652F;&#x6301;&#x7684;&#x914D;&#x7F6E;&#x9879;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>app.name &#x5E94;&#x7528;&#x540D;&#x79F0;&#xFF08;&#x53EF;&#x9009;&#x9879;&#xFF09;</li>
<li>app.env &#x9ED8;&#x8BA4;&#x4E3A; NODE_ENV &#x6216;&#x8005; development</li>
<li>app.proxy &#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x5219;&#x89E3;&#x6790; &quot;Host&quot; &#x7684; header &#x57DF;&#xFF0C;&#x5E76;&#x652F;&#x6301; X-Forwarded-Host</li>
<li>app.subdomainOffset &#x9ED8;&#x8BA4;&#x4E3A;2&#xFF0C;&#x8868;&#x793A; .subdomains &#x6240;&#x5FFD;&#x7565;&#x7684;&#x5B57;&#x7B26;&#x504F;&#x79FB;&#x91CF;&#x3002;</li>
</ul>
<h2 id="t7&#x5E26;&#x4F60;&#x4E86;&#x89E3;koa&#x7684;API">&#x5E26;&#x4F60;&#x4E86;&#x89E3;koa&#x7684;API <a href="#t7&#x5E26;&#x4F60;&#x4E86;&#x89E3;koa&#x7684;API"> # </a></h2>
<h3 id="t8app.listen(...)">app.listen(...) <a href="#t8app.listen(...)"> # </a></h3>
<p>Koa &#x5E94;&#x7528;&#x5E76;&#x975E;&#x662F;&#x4E00;&#x4E2A; 1-to-1 &#x8868;&#x5F81;&#x5173;&#x7CFB;&#x7684; HTTP &#x670D;&#x52A1;&#x5668;&#x3002; &#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;Koa&#x5E94;&#x7528;&#x53EF;&#x4EE5;&#x88AB;&#x6302;&#x8F7D;&#x5230;&#x4E00;&#x8D77;&#x7EC4;&#x6210;&#x4E00;&#x4E2A;&#x5305;&#x542B;&#x5355;&#x4E00; HTTP &#x670D;&#x52A1;&#x5668;&#x7684;&#x5927;&#x578B;&#x5E94;&#x7528;&#x7FA4;&#x3002;</p>
<p>&#x5982;&#x4E0B;&#x4E3A;&#x4E00;&#x4E2A;&#x7ED1;&#x5B9A;3000&#x7AEF;&#x53E3;&#x7684;&#x7B80;&#x5355; Koa &#x5E94;&#x7528;&#xFF0C;&#x5176;&#x521B;&#x5EFA;&#x5E76;&#x8FD4;&#x56DE;&#x4E86;&#x4E00;&#x4E2A; HTTP &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x4E3A; Server#listen() &#x4F20;&#x9012;&#x6307;&#x5B9A;&#x53C2;&#x6570;</p>
<p>&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code>var koa = require(&apos;koa&apos;);
var app = koa();
app.listen(3000);
</code></pre><p>&#x8FD9;&#x4E48;&#x8F7B;&#x8F7B;&#x677E;&#x677E;&#x5C31;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;http&#x670D;&#x52A1;&#xFF0C;&#x7B80;&#x76F4;&#x662F;&#x7889;&#x5821;&#x4E86;&#xFF0C;&#x5176;&#x5B9E;&#x7B80;&#x6D01;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x7531;&#x4E8E;koa&#x5BF9;listen&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x5C01;&#x88C5;&#xFF0C;&#x5B9E;&#x73B0;&#x7684;&#x8FC7;&#x7A0B;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x3002;</p>
<pre><code>var http = require(&apos;http&apos;);
var koa = require(&apos;koa&apos;);
var app = koa();
http.createServer(app.callback()).listen(3000);
</code></pre><p>&#x8FD9;&#x610F;&#x5473;&#x7740;&#x60A8;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x652F;&#x6301; HTTPS &#x548C; HTTPS&#xFF0C;&#x6216;&#x8005;&#x5728;&#x591A;&#x4E2A;&#x7AEF;&#x53E3;&#x76D1;&#x542C;&#x540C;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x3002;</p>
<pre><code>var http = require(&apos;http&apos;);
var koa = require(&apos;koa&apos;);
var app = koa();
http.createServer(app.callback()).listen(3000);
http.createServer(app.callback()).listen(3001);
</code></pre><h3 id="t9app.callback()">app.callback() <a href="#t9app.callback()"> # </a></h3>
<p>&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x9002;&#x5408; http.createServer() &#x65B9;&#x6CD5;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7528;&#x6765;&#x5904;&#x7406;&#x8BF7;&#x6C42;&#x3002; &#x60A8;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5C06;&#x60A8;&#x7684;app&#x6302;&#x8F7D;&#x5728; Connect/Express &#x5E94;&#x7528;&#x4E0A;&#x3002;</p>
<h3 id="t10&#x66F4;&#x591A;API">&#x66F4;&#x591A;API <a href="#t10&#x66F4;&#x591A;API"> # </a></h3>
<p>&#x8BE6;&#x60C5;&#x8BF7;&#x770B;&#x8FD9;&#x91CC;&#xFF1A;<code>https://github.com/koajs/koa/wiki</code>&#x3002;&#x76F4;&#x63A5;&#x4E0A;koa&#x7684;github wiki&#x770B;&#x3002;</p>
<h3 id="t11&#x9519;&#x8BEF;&#x5904;&#x7406;">&#x9519;&#x8BEF;&#x5904;&#x7406; <a href="#t11&#x9519;&#x8BEF;&#x5904;&#x7406;"> # </a></h3>
<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;Koa&#x4F1A;&#x5C06;&#x6240;&#x6709;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x8F93;&#x51FA;&#x5230; stderr&#xFF0C;&#x9664;&#x975E; NODE_ENV &#x662F; &quot;test&quot;&#x3002;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x81EA;&#x5B9A;&#x4E49;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x903B;&#x8F91;&#xFF08;&#x6BD4;&#x5982; centralized logging&#xFF09;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0; &quot;error&quot; &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5668;&#x3002;</p>
<pre><code>app.on(&apos;error&apos;, function(err){
  log.error(&apos;server error&apos;, err);
});
</code></pre><p>&#x5982;&#x679C;&#x9519;&#x8BEF;&#x53D1;&#x751F;&#x5728; &#x8BF7;&#x6C42;/&#x54CD;&#x5E94; &#x73AF;&#x8282;&#xFF0C;&#x5E76;&#x4E14;&#x5176;&#x4E0D;&#x80FD;&#x591F;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;&#x65F6;&#xFF0C;Contenxt &#x5B9E;&#x4F8B;&#x4E5F;&#x4F1A;&#x88AB;&#x4F20;&#x9012;&#x5230; error &#x4E8B;&#x4EF6;&#x76D1;&#x542C;&#x5668;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x91CC;&#x3002;</p>
<pre><code>app.on(&apos;error&apos;, function(err, ctx){
  log.error(&apos;server error&apos;, err, ctx);
});
</code></pre><p>&#x5F53;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x4F46;&#x4ECD;&#x80FD;&#x591F;&#x54CD;&#x5E94;&#x5BA2;&#x6237;&#x7AEF;&#x65F6;&#xFF08;&#x6BD4;&#x5982;&#x6CA1;&#x6709;&#x6570;&#x636E;&#x5199;&#x5230;socket&#x4E2D;&#xFF09;&#xFF0C;Koa&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;500&#x9519;&#x8BEF;(Internal Server Error)&#x3002;</p>
<p>&#x65E0;&#x8BBA;&#x54EA;&#x79CD;&#x60C5;&#x51B5;&#xFF0C;Koa&#x90FD;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x5E94;&#x7528;&#x7EA7;&#x522B;&#x7684;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x4EE5;&#x4FBF;&#x5B9E;&#x73B0;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x7B49;&#x76EE;&#x7684;&#x3002;</p>
<h2 id="t12Context">Context <a href="#t12Context"> # </a></h2>
<p>Koa Context &#x5C06; node &#x7684; request &#x548C; response &#x5BF9;&#x8C61;&#x5C01;&#x88C5;&#x5728;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x5BF9;&#x8C61;&#x91CC;&#x9762;&#xFF0C;&#x5176;&#x4E3A;&#x7F16;&#x5199; web &#x5E94;&#x7528;&#x548C; API &#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x6709;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x8FD9;&#x4E9B;&#x64CD;&#x4F5C;&#x5728; HTTP &#x670D;&#x52A1;&#x5668;&#x5F00;&#x53D1;&#x4E2D;&#x7ECF;&#x5E38;&#x4F7F;&#x7528;&#xFF0C;&#x56E0;&#x6B64;&#x5176;&#x88AB;&#x6DFB;&#x52A0;&#x5728;&#x4E0A;&#x4E0B;&#x6587;&#x8FD9;&#x4E00;&#x5C42;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x66F4;&#x9AD8;&#x5C42;&#x6846;&#x67B6;&#x4E2D;&#xFF0C;&#x56E0;&#x6B64;&#x5C06;&#x8FEB;&#x4F7F;&#x4E2D;&#x95F4;&#x4EF6;&#x9700;&#x8981;&#x91CD;&#x65B0;&#x5B9E;&#x73B0;&#x8FD9;&#x4E9B;&#x5E38;&#x7528;&#x65B9;&#x6CD5;&#x3002;</p>
<p>context &#x5728;&#x6BCF;&#x4E2A; request &#x8BF7;&#x6C42;&#x4E2D;&#x88AB;&#x521B;&#x5EFA;&#xFF0C;&#x5728;&#x4E2D;&#x95F4;&#x4EF6;&#x4E2D;&#x4F5C;&#x4E3A;&#x63A5;&#x6536;&#x5668;(receiver)&#x6765;&#x5F15;&#x7528;&#xFF0C;&#x6216;&#x8005;&#x901A;&#x8FC7; this &#x6807;&#x8BC6;&#x7B26;&#x6765;&#x5F15;&#x7528;&#xFF1A;</p>
<pre><code>app.use(function *(){
  this; // is the Context
  this.request; // is a koa Request
  this.response; // is a koa Response
});
</code></pre><p>&#x8BB8;&#x591A; context &#x7684;&#x8BBF;&#x95EE;&#x5668;&#x548C;&#x65B9;&#x6CD5;&#x4E3A;&#x4E86;&#x4FBF;&#x4E8E;&#x8BBF;&#x95EE;&#x548C;&#x8C03;&#x7528;&#xFF0C;&#x7B80;&#x5355;&#x7684;&#x59D4;&#x6258;&#x7ED9;&#x4ED6;&#x4EEC;&#x7684; ctx.request &#x548C; ctx.response &#x6240;&#x5BF9;&#x5E94;&#x7684;&#x7B49;&#x4EF7;&#x65B9;&#x6CD5;&#xFF0C; &#x6BD4;&#x5982;&#x8BF4; ctx.type &#x548C; ctx.length &#x4EE3;&#x7406;&#x4E86; response &#x5BF9;&#x8C61;&#x4E2D;&#x5BF9;&#x5E94;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;ctx.path &#x548C; ctx.method &#x4EE3;&#x7406;&#x4E86; request &#x5BF9;&#x8C61;&#x4E2D;&#x5BF9;&#x5E94;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>
<h3 id="t13ctx&#x5BF9;&#x8C61;&#x91CC;&#x9762;&#x7684;API&#x4EEC;">ctx&#x5BF9;&#x8C61;&#x91CC;&#x9762;&#x7684;API&#x4EEC; <a href="#t13ctx&#x5BF9;&#x8C61;&#x91CC;&#x9762;&#x7684;API&#x4EEC;"> # </a></h3>
<p>ctx.req</p>
<p>Node &#x7684; request &#x5BF9;&#x8C61;&#x3002;</p>
<p>ctx.res</p>
<p>Node &#x7684; response &#x5BF9;&#x8C61;&#x3002;</p>
<p>Koa &#x4E0D;&#x652F;&#x6301; &#x76F4;&#x63A5;&#x8C03;&#x7528;&#x5E95;&#x5C42; res &#x8FDB;&#x884C;&#x54CD;&#x5E94;&#x5904;&#x7406;&#x3002;&#x8BF7;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B; node &#x5C5E;&#x6027;&#xFF1A;</p>
<p>res.statusCode
res.writeHead()
res.write()
res.end()
ctx.request</p>
<p>Koa &#x7684; Request &#x5BF9;&#x8C61;&#x3002;</p>
<p>ctx.response</p>
<p>Koa &#x7684; Response &#x5BF9;&#x8C61;&#x3002;</p>
<p>ctx.app</p>
<p>&#x5E94;&#x7528;&#x5B9E;&#x4F8B;&#x5F15;&#x7528;&#x3002;</p>
<p>ctx.cookies.get(name, [options])</p>
<p>&#x83B7;&#x5F97; cookie &#x4E2D;&#x540D;&#x4E3A; name &#x7684;&#x503C;&#xFF0C;options &#x4E3A;&#x53EF;&#x9009;&#x53C2;&#x6570;&#xFF1A;</p>
<p>&apos;signed&apos;: &#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x8868;&#x793A;&#x8BF7;&#x6C42;&#x65F6; cookie &#x9700;&#x8981;&#x8FDB;&#x884C;&#x7B7E;&#x540D;&#x3002;
&#x6CE8;&#x610F;&#xFF1A;Koa &#x4F7F;&#x7528;&#x4E86; Express &#x7684; cookies &#x6A21;&#x5757;&#xFF0C;options &#x53C2;&#x6570;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5730;&#x76F4;&#x63A5;&#x8FDB;&#x884C;&#x4F20;&#x9012;&#x3002;</p>
<p>ctx.cookies.set(name, value, [options])</p>
<p>&#x8BBE;&#x7F6E; cookie &#x4E2D;&#x540D;&#x4E3A; name &#x7684;&#x503C;&#xFF0C;options &#x4E3A;&#x53EF;&#x9009;&#x53C2;&#x6570;&#xFF1A;</p>
<p>signed: &#x662F;&#x5426;&#x8981;&#x505A;&#x7B7E;&#x540D;
expires: cookie &#x6709;&#x6548;&#x671F;&#x65F6;&#x95F4;
path: cookie &#x7684;&#x8DEF;&#x5F84;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; /&apos;
domain: cookie &#x7684;&#x57DF;
secure: false &#x8868;&#x793A; cookie &#x901A;&#x8FC7; HTTP &#x534F;&#x8BAE;&#x53D1;&#x9001;&#xFF0C;true &#x8868;&#x793A; cookie &#x901A;&#x8FC7; HTTPS &#x53D1;&#x9001;&#x3002;
httpOnly: true &#x8868;&#x793A; cookie &#x53EA;&#x80FD;&#x901A;&#x8FC7; HTTP &#x534F;&#x8BAE;&#x53D1;&#x9001;
&#x6CE8;&#x610F;&#xFF1A;Koa &#x4F7F;&#x7528;&#x4E86; Express &#x7684; cookies &#x6A21;&#x5757;&#xFF0C;options &#x53C2;&#x6570;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5730;&#x76F4;&#x63A5;&#x8FDB;&#x884C;&#x4F20;&#x9012;&#x3002;</p>
<p>ctx.throw(msg, [status])</p>
<p>&#x629B;&#x51FA;&#x5305;&#x542B; .status &#x5C5E;&#x6027;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; 500&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x8BA9; Koa &#x51C6;&#x786E;&#x7684;&#x54CD;&#x5E94;&#x5904;&#x7406;&#x72B6;&#x6001;&#x3002; Koa&#x652F;&#x6301;&#x4EE5;&#x4E0B;&#x7EC4;&#x5408;&#xFF1A;</p>
<p>this.throw(403)
this.throw(&apos;name required&apos;, 400)
this.throw(400, &apos;name required&apos;)
this.throw(&apos;something exploded&apos;)
this.throw(&apos;name required&apos;, 400) &#x7B49;&#x4EF7;&#x4E8E;&#xFF1A;</p>
<p>var err = new Error(&apos;name required&apos;);
err.status = 400;
throw err;
&#x6CE8;&#x610F;&#xFF1A;&#x8FD9;&#x4E9B;&#x7528;&#x6237;&#x7EA7;&#x9519;&#x8BEF;&#x88AB;&#x6807;&#x8BB0;&#x4E3A; err.expose&#xFF0C;&#x5176;&#x610F;&#x5473;&#x7740;&#x8FD9;&#x4E9B;&#x6D88;&#x606F;&#x88AB;&#x51C6;&#x786E;&#x63CF;&#x8FF0;&#x4E3A;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x54CD;&#x5E94;&#xFF0C;&#x800C;&#x5E76;&#x975E;&#x4F7F;&#x7528;&#x5728;&#x60A8;&#x4E0D;&#x60F3;&#x6CC4;&#x9732;&#x5931;&#x8D25;&#x7EC6;&#x8282;&#x7684;&#x573A;&#x666F;&#x4E2D;&#x3002;</p>
<p>ctx.respond</p>
<p>&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x4F7F;&#x7528; Koa &#x7684;&#x5185;&#x7F6E;&#x54CD;&#x5E94;&#x5904;&#x7406;&#x529F;&#x80FD;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8D4B;&#x503C; this.repond = false;&#x3002;&#x5982;&#x679C;&#x60A8;&#x4E0D;&#x60F3;&#x8BA9; Koa &#x6765;&#x5E2E;&#x52A9;&#x60A8;&#x5904;&#x7406; reponse&#xFF0C;&#x800C;&#x662F;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x539F;&#x751F; res &#x5BF9;&#x8C61;&#xFF0C;&#x90A3;&#x4E48;&#x8BF7;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x6CE8;&#x610F;&#xFF1A; &#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x4E0D;&#x88AB; Koa &#x652F;&#x6301;&#x7684;&#x3002;&#x5176;&#x53EF;&#x80FD;&#x4F1A;&#x7834;&#x574F; Koa &#x4E2D;&#x95F4;&#x4EF6;&#x548C; Koa &#x672C;&#x8EAB;&#x7684;&#x4E00;&#x4E9B;&#x529F;&#x80FD;&#x3002;&#x5176;&#x53EA;&#x4F5C;&#x4E3A;&#x4E00;&#x79CD; hack &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5E76;&#x53EA;&#x5BF9;&#x90A3;&#x4E9B;&#x60F3;&#x8981;&#x5728; Koa &#x65B9;&#x6CD5;&#x548C;&#x4E2D;&#x95F4;&#x4EF6;&#x4E2D;&#x4F7F;&#x7528;&#x4F20;&#x7EDF; fn(req, res) &#x65B9;&#x6CD5;&#x7684;&#x4EBA;&#x6765;&#x8BF4;&#x4F1A;&#x5E26;&#x6765;&#x4FBF;&#x5229;&#x3002;</p>
<p>Request aliases</p>
<p>&#x4EE5;&#x4E0B;&#x8BBF;&#x95EE;&#x5668;&#x548C;&#x522B;&#x540D;&#x4E0E; Request &#x7B49;&#x4EF7;&#xFF1A;</p>
<pre><code>ctx.header
ctx.method
ctx.method=
ctx.url
ctx.url=
ctx.originalUrl
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
ctx.fresh
ctx.stale
ctx.socket
ctx.protocol
ctx.secure
ctx.ip
ctx.ips
ctx.subdomains
ctx.is()
ctx.accepts()
ctx.acceptsEncodings()
ctx.acceptsCharsets()
ctx.acceptsLanguages()
ctx.get()
</code></pre><p>Response aliases</p>
<p>&#x4EE5;&#x4E0B;&#x8BBF;&#x95EE;&#x5668;&#x548C;&#x522B;&#x540D;&#x4E0E; Response &#x7B49;&#x4EF7;&#xFF1A;</p>
<pre><code>ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.length=
ctx.length
ctx.type=
ctx.type
ctx.headerSent
ctx.redirect()
ctx.attachment()
ctx.set()
ctx.remove()
ctx.lastModified=
ctx.etag=
</code></pre><h2 id="t14&#x76F8;&#x5173;&#x5B66;&#x4E60;&#x8D44;&#x6599;">&#x76F8;&#x5173;&#x5B66;&#x4E60;&#x8D44;&#x6599; <a href="#t14&#x76F8;&#x5173;&#x5B66;&#x4E60;&#x8D44;&#x6599;"> # </a></h2>
<p>GitHub repository&#xFF1A;<a href="https://github.com/koajs">https://github.com/koajs</a>
Examples&#xFF1A;<a href="https://github.com/koajs/examples">https://github.com/koajs/examples</a>
Wiki&#xFF1A;<a href="https://github.com/koajs/koa/wiki">https://github.com/koajs/koa/wiki</a>
Guide&#xFF1A;<a href="https://github.com/koajs/koa/blob/master/docs/guide.md">https://github.com/koajs/koa/blob/master/docs/guide.md</a></p>

        <div class="copyright">Powered by <a href="https://github.com/jaywcjlove/idoc" target="_blank">idoc</a>. Dependence <a href="https://nodejs.org">Node.js</a> run.</div>
    </div>

</div>


</body>
</html>
